package com.yowasa.xiuxian.engine.message.map;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.google.common.collect.Lists;
import com.yowasa.xiuxian.annoations.CMD;
import com.yowasa.xiuxian.engine.message.CmdMessageHandler;
import com.yowasa.xiuxian.entity.bo.user.UserBO;
import com.yowasa.xiuxian.entity.enums.CmdScopeEnum;
import com.yowasa.xiuxian.entity.enums.MapEnum;
import com.yowasa.xiuxian.entity.mys.SendMessage;
import com.yowasa.xiuxian.entity.po.XiuXianExtend;
import com.yowasa.xiuxian.entity.po.XiuxianNpcTab;
import com.yowasa.xiuxian.entity.po.XiuxianTaskTab;
import com.yowasa.xiuxian.entity.po.XiuxianUserTask;
import com.yowasa.xiuxian.exception.HandlerException;
import com.yowasa.xiuxian.service.RedisService;
import com.yowasa.xiuxian.service.helper.ExtendHelper;
import com.yowasa.xiuxian.service.helper.MessageHelper;
import com.yowasa.xiuxian.service.helper.TaskHelper;
import com.yowasa.xiuxian.service.helper.UserHelper;
import com.yowasa.xiuxian.util.RandomUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@CMD(name = "/冒险家协会", scope = CmdScopeEnum.ALL)
public class MerchantAdvenceHandler extends CmdMessageHandler {

    @Autowired
    private UserHelper userHelper;
    @Autowired
    private MessageHelper messageHelper;
    @Autowired
    private TaskHelper taskHelper;
    @Autowired
    private ExtendHelper extendHelper;
    @Autowired
    private RedisService redisService;
    public static final Logger logger = LoggerFactory.getLogger(MerchantAdvenceHandler.class);

    @Override
    public void execute(SendMessage message) {
        UserBO userBO = userHelper.checkOpUserAll(message);
        MapEnum map = MapEnum.getById(userBO.getLocal());
        List<String> params = getAllParam(message);//获取名称
        if (StringUtils.isEmpty(params.get(0))) {
            messageHelper.replyMys(message, "可以在后面追加 传送 接取 进度 提交 幻梦池 等二级指令进行后续操作\n ");
            return;
        }
        if ("传送".equals(params.get(0))) {
            if (map.getType() != 2) {
                throw new HandlerException("只有城市中有冒险家协会");
            }
            if (params.size() < 2){
                throw new HandlerException("请输入你要传送的地点");
            }
            MapEnum byName = MapEnum.getByName(params.get(1));
            if(byName == null){
                throw new HandlerException("不存在这样的地点");
            }
            XiuXianExtend byAccountId = extendHelper.getByAccountId(userBO.getId());
            if(byName.getType() == 4){
                if(byAccountId.getResin() >= 1){
                    byAccountId.setResin(byAccountId.getResin() - 1);
                    extendHelper.updateExtendById(byAccountId);
                    String redisKey = "mys:xiuxian:userInfo:mijingTravel:"+userBO.getUserId();
                    redisService.set(redisKey,byName.getName(),60*60);
                }else {
                    throw new HandlerException("前往秘境需要一个原粹树脂");
                }
            }
            userBO.setLocal(byName.getId());
            userBO.setLocalName(byName.getName());

            userHelper.saveUserInfo(userBO);
            messageHelper.replyMys(message, "传送到了【"+byName.getName()+"】");

        }
        if ("接取".equals(params.get(0))) {
            if (map.getType() != 2) {
                throw new HandlerException("只有城市中有冒险家协会");
            }
            XiuxianTaskTab task = taskHelper.getRandomTaskByUser(userBO);
            if (task == null){
                throw new HandlerException("你已经领取过每日任务了，不能太贪心哦");
            }
            XiuxianNpcTab npc = taskHelper.getNpcById(task.getNpcId());
            messageHelper.replyMys(message,MessageFormat.format("你接取了任务{0}，请前往{1}与{2}对话了解详情",task.getName(),MapEnum.getById(npc.getMapId()).getName(),npc.getNpcName()));
        }
        if ("进度".equals(params.get(0))) {
            XiuxianUserTask nowTakByUserId = taskHelper.getNowTakByUserId(userBO.getId());
            XiuxianNpcTab npc = taskHelper.getNpcById(nowTakByUserId.getXiuxianTaskTab().getNpcId());
            messageHelper.replyMys(message,buildMsg(nowTakByUserId.getXiuxianTaskTab(), npc));

        }
        if ("提交".equals(params.get(0))) {
            if (map.getType() != 2) {
                throw new HandlerException("只有城市中有冒险家协会");
            }
            XiuxianUserTask nowTakByUserId = taskHelper.getNowTakByUserId(userBO.getId());
            if(nowTakByUserId == null || nowTakByUserId.getXiuxianTaskTab().getType() != 5){
                throw new HandlerException("当前没有在进行的任务或任务尚未完成");
            }
            taskHelper.completeTask(nowTakByUserId);
            XiuXianExtend byAccountId = extendHelper.getByAccountId(userBO.getId());
            byAccountId.setResin(byAccountId.getResin() + 1);
            byAccountId.setRough(byAccountId.getRough() + 40);
            extendHelper.updateExtendById(byAccountId);
            messageHelper.replyMys(message,"感谢你完成了今天的委托，这是你的奖励\n你获得了40原石，1个原粹树脂");
        }
        if ("幻梦池".equals(params.get(0))) {
            if (map.getId() != 10) {
                throw new HandlerException("仅在狄花洲存在幻梦池");
            }
            if(params.size() <= 1){
                throw new HandlerException("请选择你要提升的灵根\n正确指令为 /冒险家协会 幻梦池 金 确认\n只输入元素为查询价格，元素后输入任意值即为确认提升，将直接扣除摩拉");
            }
            String element = params.get(1);
            ArrayList<String> list = Lists.newArrayList("金", "木", "水", "火", "土");
            if(!list.contains(element)){
                throw new HandlerException("请输入正确的灵根");
            }
            Integer integer = userBO.getElement().get(element);
            Integer cost = 2000;
            if(integer > 10){
                cost = 5000;
            }
            if(integer > 15){
                cost = 10000;
            }
            if(integer > 20){
                int i = integer / 10;
                cost = 10000 * i;
            }
            if(params.size() <= 2){
                messageHelper.replyMys(message,"提升当前灵根需要"+cost+"摩拉");
            }else {
                if(userBO.getUserConfig().getGold() < cost || integer >= 100){
                    throw new HandlerException("你的摩拉不足或该灵根已达极限");
                }
//狄花洲的地脉涌动凝结成了一个个元素水池，沉浸其中可获得不同的灵根提升
//因为地形环境复杂，为保证安全，由冒险家协会运作收费
//随灵根浓度不同，提升所需摩拉也不同，每次可提升1-3点灵根浓度，且随机降低一项其他灵根
                userBO.getUserConfig().setGold(userBO.getUserConfig().getGold() - cost);
                int i = RandomUtil.randomInt(1, 3);
                if(integer + i > 100){
                    i = 100 - integer;
                }
                userBO.getElement().put(element,integer + i);
                int finalI = i;
                List<String> collect = list.stream().filter(e -> userBO.getElement().get(e) > finalI && !e.equals(element)).collect(Collectors.toList());
                String choice = RandomUtil.choice(collect);
                if(StrUtil.isBlank(choice)){
                    throw new HandlerException("暂无可降低的灵根，本次提纯失败！");
                }
                userBO.getElement().put(choice,userBO.getElement().get(choice) - i);
                userHelper.saveUserInfo(userBO);
                StringBuffer sb = new StringBuffer();
                sb.append("本次提升").append(element).append("灵根浓度").append(i).append("点，降低了").append(choice).append("灵根浓度").append(i).append("点\n").append("消耗了摩拉").append(cost);
                messageHelper.replyMys(message,"狄花洲的地脉涌动凝结成了一个个元素水池，沉浸其中可获得不同的灵根提升\n" +
                        "因为地形环境复杂，为保证安全，由冒险家协会运作收费\n" +
                        "随灵根浓度不同，提升所需摩拉也不同，每次可提升1-3点灵根浓度，且随机降低一项其他灵根\n\n"+sb.toString());
            }
        }
    }

    private String buildMsg(XiuxianTaskTab task, XiuxianNpcTab npc) {
        if(task == null){
            return "你当前没有任务在进行";
        }
        Integer type = task.getType();
        switch (type){
            case 1:
                return MessageFormat.format("请前往{0}与[{1}]进行交谈",MapEnum.getById(npc.getMapId()).getName(),npc.getNpcName());
            case 2:
                return MessageFormat.format("向{0}的{1}提交物品：[{2}]*{3}",MapEnum.getById(npc.getMapId()).getName(),npc.getNpcName(),task.getName(),task.getNum());
            case 3:
                return MessageFormat.format("请前往{0}讨伐魔物{1}",MapEnum.getById(npc.getMapId()).getName(),npc.getNpcName());
            case 4:
                return MessageFormat.format("前往{0}找{1}领取物品：[{2}]*{3}",MapEnum.getById(npc.getMapId()).getName(),npc.getNpcName(),task.getName(),task.getNum());
            case 5:
                return "任务已完成，请寻找凯瑟琳提交委托";
            default:
                return "意料之外的错误";
        }


    }

//    public String desc(){
//        return new StringBuffer().append("冒险家协会为各位玩家提供了传送功能\n")
//                .append("可使用冒险家协会的传送阵去往任何地点，但只有城市里存在冒险家协会\n")
//                .append("冒险家协会还提供了每日委托供玩家接取，每日仅可完成一个委托，获得奖励")
//                .toString();
//
//    }
}
